self.add_source(source, Kind::Locked);
}
- fn add_source(&mut self, source: Box<Source + 'cfg>,
- kind: Kind) {
+ fn add_source(&mut self, source: Box<Source + 'cfg>, kind: Kind) {
let id = source.source_id().clone();
self.sources.insert(source);
self.source_ids.insert(id.clone(), (id, kind));
// paths. The packages themselves can be looked up through the `packages`
// set above.
members: Vec<PathBuf>,
+
+ // True, if this is a temporary workspace created for the purposes of
+ // cargo install or cargo package.
+ is_ephemeral: bool,
}
// Separate structure for tracking loaded packages (to avoid loading anything
root_manifest: None,
target_dir: target_dir,
members: Vec::new(),
+ is_ephemeral: false,
};
ws.root_manifest = ws.find_root(manifest_path)?;
ws.find_members()?;
///
/// This is currently only used in niche situations like `cargo install` or
/// `cargo package`.
- pub fn one(package: Package, config: &'cfg Config, target_dir: Option<Filesystem>)
- -> CargoResult<Workspace<'cfg>> {
+ pub fn ephemeral(package: Package, config: &'cfg Config, target_dir: Option<Filesystem>)
+ -> CargoResult<Workspace<'cfg>> {
let mut ws = Workspace {
config: config,
current_manifest: package.manifest_path().to_path_buf(),
root_manifest: None,
target_dir: None,
members: Vec::new(),
+ is_ephemeral: true,
};
{
let key = ws.current_manifest.parent().unwrap();
}
}
+ pub fn is_ephemeral(&self) -> bool {
+ self.is_ephemeral
+ }
+
/// Finds the root of a workspace for the crate whose manifest is located
/// at `manifest_path`.
///
};
let ws = match overidden_target_dir {
- Some(dir) => Workspace::one(pkg, config, Some(dir))?,
+ Some(dir) => Workspace::ephemeral(pkg, config, Some(dir))?,
None => Workspace::new(pkg.manifest_path(), config)?,
};
let pkg = ws.current()?;
let new_pkg = Package::new(new_manifest, &manifest_path);
// Now that we've rewritten all our path dependencies, compile it!
- let ws = Workspace::one(new_pkg, config, None)?;
+ let ws = Workspace::ephemeral(new_pkg, config, None)?;
ops::compile_ws(&ws, None, &ops::CompileOptions {
config: config,
jobs: opts.jobs,
/// lockfile.
pub fn resolve_ws<'a>(ws: &Workspace<'a>) -> CargoResult<(PackageSet<'a>, Resolve)> {
let mut registry = PackageRegistry::new(ws.config())?;
- let resolve = resolve_with_registry(ws, &mut registry, true)?;
+ let resolve = resolve_with_registry(ws, &mut registry)?;
let packages = get_resolved_packages(&resolve, registry);
Ok((packages, resolve))
}
}).map(|s| s.to_string()).collect::<Vec<String>>();
let mut registry = PackageRegistry::new(ws.config())?;
-
- // Avoid writing a lockfile if we are `cargo install`ing a non local package.
- let write_lockfile = source.is_none() || ws.current_opt().is_none();
-
if let Some(source) = source {
registry.add_preloaded(source);
}
// First, resolve the root_package's *listed* dependencies, as well as
// downloading and updating all remotes and such.
- let resolve = resolve_with_registry(ws, &mut registry, write_lockfile)?;
+ let resolve = resolve_with_registry(ws, &mut registry)?;
// Second, resolve with precisely what we're doing. Filter out
// transitive dependencies if necessary, specify features, handle
Ok((packages, resolved_with_overrides))
}
-fn resolve_with_registry(ws: &Workspace, registry: &mut PackageRegistry, write_lockfile: bool)
+fn resolve_with_registry(ws: &Workspace, registry: &mut PackageRegistry)
-> CargoResult<Resolve> {
let prev = ops::load_pkg_lockfile(ws)?;
let resolve = resolve_with_previous(registry, ws,
Method::Everything,
prev.as_ref(), None, &[])?;
- if write_lockfile {
+ if !ws.is_ephemeral() {
ops::write_pkg_lockfile(ws, &resolve)?;
}
Ok(resolve)